/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef UTILS_CRYPTO_H
#define UTILS_CRYPTO_H

#include <string>
#include <vector>

namespace El {
namespace Utils {

/**
 * @brief Base64编码
 * @param data 要编码的数据
 * @return 编码后的字符串
 */
std::string Base64Encode(const std::vector<unsigned char> &data);

/**
 * @brief Base64解码
 * @param encoded_string 要解码的字符串
 * @return 解码后的数据
 */
std::vector<unsigned char> Base64Decode(const std::string &encoded_string);

/**
 * @brief 十六进制编码
 * @param data 要编码的数据
 * @return 编码后的十六进制字符串
 */
std::string HexEncode(const std::vector<unsigned char> &data);

/**
 * @brief 十六进制解码
 * @param hex_string 要解码的十六进制字符串
 * @return 解码后的数据
 */
std::vector<unsigned char> HexDecode(const std::string &hex_string);

/**
 * @brief MD5哈希计算
 * @param data 要计算哈希的数据
 * @return MD5哈希值的十六进制字符串
 */
std::string Md5Hash(const std::vector<unsigned char> &data);

/**
 * @brief MD5哈希计算（字符串版本）
 * @param data 要计算哈希的字符串数据
 * @return MD5哈希值的十六进制字符串
 */
std::string Md5Hash(const std::string &data);

/**
 * @brief SHA256哈希计算
 * @param data 要计算哈希的数据
 * @return SHA256哈希值的十六进制字符串
 */
std::string Sha256Hash(const std::vector<unsigned char> &data);

/**
 * @brief SHA256哈希计算（字符串版本）
 * @param data 要计算哈希的字符串数据
 * @return SHA256哈希值的十六进制字符串
 */
std::string Sha256Hash(const std::string &data);

/**
 * @brief 生成随机字节数组
 * @param length 要生成的字节数组长度
 * @return 随机字节数组
 */
std::vector<unsigned char> GenerateRandomBytes(size_t length);

/**
 * @brief 简单异或加密/解密
 * @param data 要加密/解密的数据
 * @param key 密钥
 * @return 加密/解密后的数据
 */
std::vector<unsigned char> XorCrypt(const std::vector<unsigned char> &data, const std::vector<unsigned char> &key);

} // namespace Utils
} // namespace El

#endif // UTILS_CRYPTO_H
